package ads.corporativa.aula0204;

import java.util.List;

import javax.swing.JOptionPane;

import ads.corporativa.aula0204.dao.ParticipanteDAO;
import ads.corporativa.aula0204.dao.ParticipanteJDBCDAO;
import ads.corporativa.aula0204.dao.impl.ParticipanteListDAO;
import ads.corporativa.aula0204.entity.Participante;
import ads.corporativa.aula0204.exceptions.MyException;

public class Principal {

	private ParticipanteDAO dao;

	public Principal() {
		dao = new ParticipanteJDBCDAO();
	}

	public static String menu() {
		StringBuilder str = new StringBuilder();
		str.append("Participantes").append("\n1 - Inserir")
				.append("\n2 - Atualizar").append("\n3 - Remover")
				.append("\n4 - Exibir (por CPF)")
				.append("\n5 - Exibir (por ID)")
				.append("\n6 - Exibir (por nome)").append("\nX - Sair")
				.append("\nOpção: ");
		return str.toString();
	}

	public static void msg(String msg) {
		JOptionPane.showMessageDialog(null, msg);
	}

	public static void msg(String msg, int type) {
		JOptionPane.showMessageDialog(null, msg, "Participante", type);
	}

	public static String input(String ask) {
		return JOptionPane.showInputDialog(ask);
	}

	public static String input(String ask, Object defaultValue) {
		return JOptionPane.showInputDialog(ask, defaultValue);
	}

	public void gravar() {
		String cpf = input("CPF");
		String nome = input("Nome");
		String fone = input("Telefone");
		String perfil = input("Perfil");
		dao.save(new Participante(cpf, nome, fone, perfil));
		msg("Cadastro efetuado com sucesso.");
	}

	public void alterar() {
		String cpf = input("Informe o CPF");
		Participante p = dao.findByCpf(cpf);
		p.setNome(input("Nome", p.getNome()));
		p.setFone(input("Telefone", p.getFone()));
		p.setPerfil(input("Perfil", p.getPerfil()));
		// Não há necessidade de chamar save para alterar, porque a referência
		// p aponta para o mesmo objeto da lista.
		// dao.save(p);
		msg("Alteração efetuada com sucesso.");
	}

	public void remover() {
		String cpf = input("Informe o CPF");
		dao.delete(dao.findByCpf(cpf).getId());
		msg("Exclusão efetuada com sucesso.");
	}

	public void exibirPeloCPF() {
		String cpf = input("Informe o CPF");
		Participante p = dao.findByCpf(cpf);
		msg(p.toString());
	}

	public void exibirPeloID() {
		Integer id = Integer.parseInt(input("Informe o ID"));
		Participante p = dao.find(id);
		msg(p.toString());
	}

	public void exibirPeloNome() {
		String nome = input("Informe o nome");
		List<Participante> participantes = dao.findByNome(nome);
		StringBuilder str = new StringBuilder();
		for (Participante p : participantes) {
			str.append(p.toString()).append("\n");
		}
		msg(str.toString());
	}

	public static void main(String[] args) {
		Principal app = new Principal();
		char opcao = '\0';
		do {
			opcao = input(menu()).charAt(0);
			try {
				if (opcao == '1') {
					app.gravar();
				} else if (opcao == '2') {
					app.alterar();
				} else if (opcao == '3') {
					app.remover();
				} else if (opcao == '4') {
					app.exibirPeloCPF();
				} else if (opcao == '5') {
					app.exibirPeloID();
				} else if (opcao == '6') {
					app.exibirPeloNome();
				}
			} catch (Exception e) {
				String msg = "Erro no sistema. Contate o analista.";
				
				if (e instanceof MyException) {
					msg = e.getMessage();
				}
				System.out.println(e);
				
				msg(msg, JOptionPane.ERROR_MESSAGE);
			}
		} while (opcao != 'x' && opcao != 'X');
	}

}
